package mapeo;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import entidades.Posteo;
import entidades.Vocabulario;

public class MapVocabulario  implements IBaseDatos{
	
	private Session session;
	private Transaction transaction;
	private Vocabulario termino;
	
	public MapVocabulario(){
		session = null;
		termino = null;
	}
	
	public Object save(Object objGuardar){
		session = HibernateUtil.getSessionFactory().openSession();
		transaction = null;
		try{
			termino = (Vocabulario) objGuardar;
		}catch(ClassCastException e){
			System.out.println("ERROR: No se puede castear el objeto a Vocabulario");
			return null;
		}
		String extensionId = null;
		try {
			transaction = session.beginTransaction();
			extensionId = (String) session.save(termino);
			transaction.commit();
		} catch (HibernateException e) {
			System.out.println("ERROR: Hibernate no puede realizar el grabado del Vocabulario");
			transaction.rollback();
			return null;
		} 
		finally {
			session.close();
		}
		return extensionId;
	}
	
	public boolean update(Object actualizado){
		Vocabulario terminoActualiz;
		try{
			terminoActualiz = (Vocabulario) actualizado;
		}catch(ClassCastException e){
			System.out.println("ERROR: Error en el casteo de parametros");
			return false;
		}
		boolean flag = true;
		session = HibernateUtil.getSessionFactory().openSession();
		transaction = null;
		try {
			transaction = session.beginTransaction();
			termino = terminoActualiz;
			session.update(termino);
			transaction.commit();
			} 
		catch (	HibernateException e) {
			System.out.println("ERROR: Hibernate no puede realizar la actualizacion del Vocabulario");
			transaction.rollback();
			flag = false;
		} 
		finally {
			session.close();
		}
		return flag;
	}
	
	public boolean delete(Object primaryKey){
		String key;
		try{
			key = (String) primaryKey;
		}catch(ClassCastException e){
			System.out.println("ERROR: No se puede castear el objeto a String");
			return false;
		}
		boolean flag= true; 
		session = HibernateUtil.getSessionFactory().openSession();
		transaction = null;
		try {
			transaction = session.beginTransaction();
			termino = (Vocabulario) session.get( Vocabulario.class, key );
			if (termino == null){
				return false;
			}
			session.delete(termino);
			transaction.commit();
		} 
		catch (HibernateException e) {
			System.out.println("ERROR: Hibernate no puede realizar el borrado del Vocabulario");
			transaction.rollback();
			flag = false;
			} 
		finally {
			session.close();
			}
		return flag;
	}

	@Override
	public Object get(Object primaryKey) {
		String key;
		try{
			key = (String) primaryKey;
		}catch(ClassCastException e){
			System.out.println("ERROR: MapVocabulario.get() No se puede castear el objeto a String");
			return null;
		}
		termino = null;
		session = HibernateUtil.getSessionFactory().openSession();
		transaction = null;
		try {
			transaction = session.beginTransaction();
			termino = (Vocabulario) session.get( Vocabulario.class, key );
			} 
		catch (HibernateException e) {
			System.out.println("ERROR: Hibernate no puede obtener el Vocabulario");
			return null;
		} 
		finally {
			session.close();
		}
		return termino;
	}
	
	/**
	 * Recorre la base de datos en busca del Vocabulario asociado con el Posteo que se pasa como parametro 
	 * @param Posteo a buscar
	 * @return el voc asociado
	 */
	@SuppressWarnings("unchecked")
	public Vocabulario obtenerVocabularioAsociado(Posteo post){
		session = HibernateUtil.getSessionFactory().openSession();
		Posteo aBuscar = post;
		String clave = aBuscar.getTermino().getTermino();
		Vocabulario resultado = null;
		try {
			ArrayList<Vocabulario> list = (ArrayList<Vocabulario>) session.createCriteria(Vocabulario.class).add( Restrictions.like("termino", clave ) ).list();
			resultado = list.get(0);
			} 
		catch (	HibernateException e) {
			System.out.println("ERROR: Hibernate no puede obtener los Vocabularios asociados al Posteo");
			return null;
		} 
		finally {
			session.close();
			}
		return resultado;
	}
	
	/**
	 * Recorre la BD y devuelve todo el Vocabulario, para poder cargarlo a memoria 
	 * @return un hashtable con todo el vocabulario existente en la BD
	 */
	@SuppressWarnings("unchecked")
	public Hashtable<String, Vocabulario> obtenerVocabulario(){
		session = HibernateUtil.getSessionFactory().openSession();
		Hashtable<String,Vocabulario> tableResult = null;
		Vocabulario voc = null;
		String termino = null;
		try {
			ArrayList<Vocabulario> list = (ArrayList<Vocabulario>) session.createCriteria(Vocabulario.class).list();
			Iterator<Vocabulario> it = list.iterator();
			tableResult = new Hashtable<String, Vocabulario>();
			while (it.hasNext()){
				voc = (Vocabulario) it.next();
				termino = voc.getTermino();
				tableResult.put(termino, voc);
			}
		} 
		catch (	HibernateException e) {
			System.out.println("ERROR: Hibernate no puede obtener los Vocabularios asociados al Posteo");
			return null;
		} 
		finally {
			session.close();
			}
		return tableResult;
	}

	@Override
	public boolean deleteAll() {
		session = HibernateUtil.getSessionFactory().openSession();
		transaction = null;
		try{
			String hql = "delete from Vocabulario";
			Query query = session.createQuery(hql);
			transaction = session.beginTransaction();
			query.executeUpdate();
			transaction.commit();
		}catch ( HibernateException e){
			System.out.println("ERROR: Hibernate no puede borrar todos los Vocabularios");
			transaction.rollback();
			return false;
		}
		finally{
			session.close();
		}
		return true;
	}
}

